/**
 * 数组读取
 *
 * @param {*} devices  传入需要读取的设备点数对象{addr: 设备地址, type: 数据类型}所组成的数组
 * @param {*} errCb    回调函数,传入响应结果对象,可用于错误处理
 */
function ReadValArr(devices, errCb) {
  // 查询字符串实例:  NUM=3&DEV1=D10&TYP1=W&DEV2=D11&TYP2=D&DEV3=M0&TYP3=B
  let param; // NUM= 读取点数个数  DEV1=D10&TYP1=W 设备1地址和数据类型, & 符号拼接
  param = "NUM=" + devices.length + "&";
  for (i = 0; i < devices.length; i++) {
    let j = i + 1;
    param = param + "DEV" + j + "=" + devices[i].addr + "&TYP" + j + "=";
    switch (devices[i].type) {
      case "bit":
        param += "B";
        break;
      case "16bit":
        param += "W";
        break;
      case "32bit":
        param += "D";
        break;
      default:
        param += "Q";
        break;
    }
    if (j < devices.length) param += "&";
  }

  //  发送查询请求
  let xhr = new XMLHttpRequest();
  xhr.open("POST", "/cgi/RdDevRnd.cgi", true);
  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  xhr.onreadystatechange = function (xhr) {
    // XMLHttpRequest 0:UNSENT 1:OPENED 2:HEADERS_RECEIVED 3:LOADING 4:DONE
    if (4 != xhr.readyState) {
      return;
    }
    if (200 != xhr.status) {
      alert("HTTP 状态错误:" + xhr.status);
      return;
    }

    let res = JSON.parse(xhr.response);
    if (errCb) {
      errCb(res);
    }

    // 返回結果判断
    if (res.RET != "0000") {
      console.log("读取错误:" + res.RET);
      return;
    } else {
      // 解析PLC返回的16进制值并返回一个数组
      return res.DATA.map((val) => parseInt(val, 16));
    }
  };
  xhr.send(param);
}

/**
 * 单个写入
 *
 * @param {*} deviceObj  {addr: 设备地址, type: 数据类型, value: 要写入的值}
 * @param {*} Cb         回调函数,传入响应结果对象,可用于错误处理
 */
function WriteVal(deviceObj, Cb) {
  //  NUM=1&DEV1=D11&TYP1=D&DATA1=a  拼接完的字符串,数值用16进制传输
  let param = "NUM=1&DEV1=" + deviceObj.addr + "&TYP1=";
  // 参数类型設定,bit位，0/1 断/通...INT , Dint
  switch (deviceObj.type) {
    case "bit":
      param += "B";
      break;
    case "16bit":
      param += "W";
      break;
    case "32bit":
      param += "D";
      break;
    default:
      param += "Q";
      break;
  }

  param += "&DATA1=" + parseInt(deviceObj.value).toString(16);
  // 向PLC Web服务器CGI发送XML请求
  let xhr = new XMLHttpRequest();
  xhr.open("POST", "/cgi/WrDev.cgi", true);
  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  xhr.onreadystatechange = function (xhr) {
    if (4 != xhr.readyState) {
      // 操作未完成
      return;
    }
    // 状态码200,响应正常
    if (200 != xhr.status) {
      alert("HTTP 状态错误:" + xhr.status);
      return;
    }
    // 解析响应
    let res = JSON.parse(xhr.response);

    if (res.RET != "0000") {
      console.log("写入失败:" + res.RET);
      if (Cb) {
        Cb(res);
      }
      return false;
    } else {
      // 正常
      if (Cb) {
        Cb(parseInt(res.DATA[0], 16));
      }
      return true;
    }
  };
  xhr.send(param);
}
